//写递归注意事项：
//1.出口条件
//2.规律(逐渐缩小)
//3.规律中；n值的变化，必定能够到达出口条件；

{
    //阶乘的递归  1*2*3*....10 10的阶乘
    //返回n的阶乘
    //10的阶乘=9的阶乘*10;
    function fn(n) {
        if (n == 1) {
            //写出口；当某些条件下；我们能够直接给出结果；不用再去递归计算；
            return 1;
        } else {
            //写规律；条件比较复杂，无法给出结果，但是可以逐层简化；
            return n * fn(n - 1); //n-1 的调佣会使得 实参 越来越小；必定能够到达n=1（出口条件）的 一天；
        }
    }
    // fn(300);
}
{
    //斐波那契数列：1 1 2 3 5 8 13 21 34....
    //前两数的和 是第三个数；
    //让你求斐波那契中第n个数是多少？

    //规律 fibo(n)=fibo(n-1)+fibo(n-2);
    //
    function fibo(n) {
        if (n == 1 || n == 2) {
            //
            return 1;
        } else {
            return fibo(n - 1) + fibo(n - 2);
        }
    }

    //青蛙跳的案例
    //一只青蛙 从山底调到山顶；需要跳100层台阶；
    //青蛙能力有限 每次只能跳一层台阶或者2层台阶；问多少种不同的跳法？
    //如果是1层 :  1
    //2------2种
    //3--------111  12  21  3种
    //4 --------- 1111   112  121  211  22 5种；
    //100层多少种？

    //简化问题：100层=99层+98层  青蛙是从99层或者98层 调到100层的！

    function fibo(n) {
        if (n == 1) {
            return 1;
        } else if (n == 2) {
            return 2;
        } else {
            return fibo(n - 1) + fibo(n - 2);
        }
    }

}
{
    //对象的深复制
    //树结构的遍历
}
{
    function fn(obj){
        return JSON.parse(JSON.stringify(obj));
    }
    //2. 方法不行；
    //3.undeifined
    let obj={
        name:"gao",
        age:undefined,
        sanName:function(){
            console.log("name");
        }
    }
    let obj2=fn(obj);
    console.log(obj2);
}
